package com.crm.api.service;

import com.crm.api.entity.Dept;
import org.springframework.cloud.netflix.feign.FeignClient;
import org.springframework.web.bind.annotation.PathVariable;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RequestMethod;

import java.util.List;

/**
 * create by yangShen
 * 2019/8/13 13:50
 * 1.定义接口 + 注解 = FeignClient设置负载均衡 --> 调用提供者
 * 2.服务熔断与服务降级：实战，项目中使用方式    --> 客户端自己处理
 */
//2.声明式(注解 @FeignClient)，feign自带负载均衡配置项

// 服务熔断/降级：接口不处理，调用者(controller)自行处理
// 测试调用者：provider-dept-8001-hystrix   (专门用来配合熔断demo)
//@FeignClient(value = "springcloud-dept")

//接口自己处理，将业务逻辑和异常处理分离，进行解耦。原理：spring面向切面进行环绕通知
//测试调用者：所有的调用该接口的模块，举例：consumer-dept-feign(消费者) -->api(引入本接口，自定义接口且分离)(本接口1.调用提供者;2.统一熔断处理) --> provider-dept-8001(提供者)
@FeignClient(value = "springcloud-dept",fallbackFactory = DeptClientServiceFallBackFactory.class)
//1.定义接口
public interface DeptClientService {

    //下面的@RequestMapping的路径是提供者的controller路径

    @RequestMapping(value = "/dept/add",method = RequestMethod.GET)
    public boolean add(Dept dept);

    @RequestMapping(value = "/dept/get/{id}",method = RequestMethod.GET)
    //接口方法中要加@PathVariable注解，否则获取不到{id}，id=null,这样会调不到提供者方法
    public Dept get(@PathVariable("id") Long id);

    @RequestMapping(value = "/dept/list",method = RequestMethod.GET)
    public List findAll();

}
